#!/usr/bin/evn python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   文件名称 :     signal_wrapper
   文件功能描述 :   功能描述
   创建人 :       小钟同学
   创建时间 :          2021/11/30
-------------------------------------------------
   修改描述-2021/11/30:         
-------------------------------------------------
"""
from blinker import signal


def signal_send(name, source='anoymous', **kw):
    """
    创建信号并发送消息
    参数：name 信号名，source:信号的发送者
    作用：根据信号名创建信号，然后发送信号，参数是发送者
    """
    name_signal = signal(name)  # 这里根据name创建一个信号
    ret = name_signal.send(source, **kw)  # 发送一个信号
    return ret


def signal_listen(name, handler):
    """
    接受信号
    参数：信号名，订阅者(用于收到信号就调用函数)
    作用：得到信号对象，绑定订阅者
    """
    name_signal = signal(name)  # 这里其实没有创建新的信号，就是之前的name信号\

    name_signal.connect(handler, weak=False)  # 绑定了订阅者


def signal_handle(name, *args, **kw):
    """
    信号接受装饰器：
    参数：信号名
    针对的func：装饰器原理是针对func的，传入的func就是这个信号的订阅者
    """
    s_name = name

    def wrapper(func):
        def inner(*args, **kw):
            func(*args, **kw)

        signal_listen(s_name, func)
        return inner

    return wrapper


if __name__ == '__main__':
    # 示例信息
    @signal_handle('test2')
    def recv(sender, **kw):
        print("Got a signal_wrapper sent by %r, data %r" % (sender, kw))
        return 'receive ok'


    @signal_handle("wx_notify_third_inters_error")
    def wx_notify_third_inters_error(sender, **kw):
        """
         接收500异常的时候是否发送相关异常信息到微信公众号上
        """
        pass
        # if DEBUG:
        print("接收到了第三方接口请求处理异常信号通知 by %r, data %r" % (sender, kw))
        # content_msg = '温馨提示=====》系统请求第三方接口处理异常' + str(json_helper.dict_to_json_ensure_ascii_indent(kw.get('traceback')))
        # weixin_helper.send_users_msg(users='XiaoZhongTongXue', content=content_msg, agentid='1000007', WXKEY='ww7651ba25a3995026', WXSECRET='5k1K25qrdS4P6V87Dehsk6VgL4jJNWFJpKiPHTEia1U')

    # 可以同时注册多个，共享同一个信号名称对象
    # from common.exts.signal_wrapper import signal_handle
    # @signal_handle("wx_notify_third_inters_error")
    # def wx_notify_third_inters_error(sender, **kw):
    #     print("接收到了第三方接口请求处理异常信号通知 by %r, data %r" % (sender, kw))
    #
    # @signal_handle("wx_notify_third_inters_error")
    # def wx_notify_third_inters_error2(sender, **kw):
    #     print("接收到了第三方接口请求处理异常信号通知222 by %r, data %r" % (sender, kw))
    #
    #
    #
    #
    # @grpcframe.route("/wx_notify")
    # def wx_notify():
    #     # 发送信号
    #     from common.exts.signal_wrapper import signal_send
    #     signal_send('wx_notify_third_inters_error', source='ThirdInternalErrorException', traceback='以长沙哈哈')
    #     return "信号自定义演示"


    # 第三方接口请求异常的时候是否发送广播通知到微信中
    # if not request_ok and is_send_wx_exceptions:
    signal_send('wx_notify_third_inters_error', source='ThirdInternalErrorException', traceback='以长沙哈哈')
    signal_send('test2', source='hsahdshh 123', test222=123)

    # name_signal: NamedSignal = signal("你妹妹！！")  # 这里其实没有创建新的信号，就是之前的name信号\
    #
    #
    # # @name_signal.connect(sender="你好2")  # 绑定了订阅者
    # def wx_notify_third_inters_error1(sender, **kw):
    #     print("接收到了1！！！！！！！！！", sender, kw)
    #
    #
    # #
    # # @name_signal.connect(sender="你好")  # 绑定了订阅者
    # def wx_notify_third_inters_error2(sender, **kw):
    #     print("接收到了2！！！！！！！！！", sender, kw)
    #
    #
    # name_signal.connect(wx_notify_third_inters_error1, sender="你好2", weak=True)  # 绑定了订阅者
    # name_signal.connect(wx_notify_third_inters_error2, sender="你好", weak=True)  # 绑定了订阅者
    # # print("什么啊pppfd！", pppfd)
    #
    # ret = name_signal1.send(("你好"), source='你大爷我的喊你回家了！', traceback='以长沙哈哈')  # 发送一个信号